/* 讲解c语言<指针>的模块 */

#include <stdio.h>

/*指针*/
void pointer()
{
    /* 在计算机中,程序会在<内存>中运行
     * 每个内存都有<地址>,地址就是<指针>
     * 存放<指针>变量称为<指针变量>
     *
     * 定义指针变量
     * 格式: type *name = pointer
     *
     * 注意: 指针变量仅能存储字符串<字面量>
     */
    char *pointer = "hello world";
    printf("pointer = %s, 地址: %p \n", pointer, (void *)pointer);
}

/*指针长度*/
void pointer_length()
{
    /*
     * 指针变量的<内存占用>取决于系统
     * 32位系统占用 4 byte(32 bit)
     * 64位系统占用 8 byte(64 bit)
     */
    int *ptr;
    char *string;
    printf("int指针: %ld, char指针: %ld \n", sizeof(ptr), sizeof(string) );

}

/*解引用*/
void pointer_dereference()
{
    /* 解引用
     * 对指针变量使用 * 是<解引用>
     * 解引用可以获取<指针>指向的<字面量>
     */
    int number = 10;
    int *pointer = &number;/*<&>符号是<取地址>,可以获取目标<指针>*/
    *pointer += 10;/*解引用并计算*/
    printf("解引用: %d \n", *pointer);
}

/*空指针*/
void pointer_null()
{
    /* 值为 NULL 或 nullptr 的指针变量是<空指针>
     * nullptr 是c23新增的关键字,编译加入 "-std=c23" 参数,否则报错
     */
    int *ptr1 = nullptr;
    printf("空指针: %p \n", (void *)ptr1);
}

/*多级指针*/
void pointer_multilevel()
{
    /*指向指针变量的指针变量*/
    char *pointer = "hello world";
    char **pointer1 = &pointer;
    printf("pointer1: %s \n", *pointer1);
}

/*常量指针*/
void pointer_const()
{
    /* 指针变量可以定义为常量(只读)
     * 格式:
     * 1. const type *name = pointer
     * 2. type const *name = pointer
     * 3. const type* const name = pointer
     * 注意:
     * 格式一限制<解引用>
     * 格式二限制<值只读>
     * 格式三<完全只读>
     */
    const char *write = "shit";
    printf("%s \n", write);

    char const *read_only = "fuck";
    printf("%s \n", read_only);

    const char* const restricted = "fucking";
    printf("%s \n", restricted);
}

int main(void)
{
    pointer_const();
}
